package com.example.demo.demo3.client;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Client extends Application {

    // 声明客户端UI对象
    private ClientUI clientUI = new ClientUI();
    // 声明输入验证器对象
    private InputValidator inputValidator = new InputValidator();
    // 声明服务器通讯器对象
    private ServerCommunicator serverCommunicator = new ServerCommunicator();

    @Override
    public void start(Stage primaryStage) {
        // 客户端UI对象调用初始化用户组件方法
        clientUI.initializeUIComponents();
        // 当客户端UI调取createGridPaneLayout方法，返回值是GridPane对象
        GridPane gridPane = clientUI.createGridPaneLayout();
        // 当客户端UI调取createResultBox方法，返回VBox对象
        VBox resultBox = clientUI.createResultBox();

        // 在第一列，第八行，该组件占用三列，一行；该位置放垂直布局容器
        gridPane.add(resultBox, 0, 7, 3, 1);

        // 以Button中的setID方法设置对应的ID之后，根据具体的ID在网格布局中寻找
        Button sendButton = (Button) gridPane.lookup("#sendButton"); // 获取发送按钮
        // 创建按钮监听,调用handleSendButtonClick处理发送按钮点击事件方法
        sendButton.setOnAction(event -> handleSendButtonClick());

        // 初始化场景，把网格布局放入场景中，并设置场景的宽为600，高为600
        Scene scene = new Scene(gridPane, 600, 600);
        // 设置舞台标题
        primaryStage.setTitle("客户端");
        // 把场景放入舞台在中
        primaryStage.setScene(scene);
        // 设置舞台可显示
        primaryStage.show();
    }

    // 处理发送按钮点击事件方法
    private void handleSendButtonClick() {
        // 调用清空错误标签提示
        clearErrorLabels();

        // 获取客户端单号输入框里面的内容，并去空
        String barcode = clientUI.getBarcodeField().getText().trim();
        // 获取客户端长度输入框里面的内容，并去空
        String lengthStr = clientUI.getLengthField().getText().trim();
        // 获取客户端宽度输入框里面的内容，并去空
        String widthStr = clientUI.getWidthField().getText().trim();
        // 获取客户端高度输入框里面的内容，并去空
        String heightStr = clientUI.getHeightField().getText().trim();
        // 获取客户端重量输入框里面的内容，并去空
        String weightStr = clientUI.getWeightField().getText().trim();

        boolean hasError = inputValidator.validateInput(barcode, lengthStr, widthStr, heightStr, weightStr, clientUI);

        // 如果不是false，则进行输入传输并清空数据，反之不进行输入传输，保留数据
        if (!hasError) {
            // 将String类型的数据进行数据转化为double类型
            double length = Double.parseDouble(lengthStr);
            double width = Double.parseDouble(widthStr);
            double height = Double.parseDouble(heightStr);
            double weight = Double.parseDouble(weightStr);

            // 进行体积数据计算
            double volume = length * width * height;
            // 把获取的信息进行字符串拼接
            String data = "barcode:" + barcode + ",weight:" + weight + ",volume:" + volume;

            // 把输入进行传输
            serverCommunicator.sendDataToServer(data, clientUI);
            // 清空输入框中的数据
            clearData();
        }
    }

    // 清空错误提示方法
    private void clearErrorLabels() {
        clientUI.getBarcodeErrorLabel().setText("");
        clientUI.getLengthErrorLabel().setText("");
        clientUI.getWidthErrorLabel().setText("");
        clientUI.getHeightErrorLabel().setText("");
        clientUI.getWeightErrorLabel().setText("");
    }

    // 清空数据方法
    private void clearData() {
        clientUI.getBarcodeField().clear();
        clientUI.getLengthField().clear();
        clientUI.getWidthField().clear();
        clientUI.getHeightField().clear();
        clientUI.getWeightField().clear();
    }

    public static void main(String[] args) {
        launch(args);
    }
}